package com.xueqiu.movieplaymanagersystem.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.xueqiu.movieplaymanagersystem.entity.Archives;
import com.xueqiu.movieplaymanagersystem.entity.Blog;

import java.util.List;

/**
 * @author xueqiu
 */
@Mapper
public interface BlogMapper {

    /**
     * 新增单个数据
     * @param originData 单个新闻据
     * @return 新增条数
     */
    int insert(
            Blog originData
    );

    /**
     * 根据id更新单条数据；更新新闻全部数据
     * 对fromLink进行了SQL判空
     * @param originData 新的数据源，其中包含新闻id
     * @return 更新条数
     */
    int update(
            Blog originData
    );

    /**
     * 更新访问量根据新闻id
     * @param blogId 新闻id
     * @return 更新条数
     */
    int updateViewsById(
            String blogId
    );

    /**
     * 更新点赞量根据新闻id
     * @param blogId 新闻id
     * @return 更新条数
     */
    int updateLikesById(
            String blogId
    );

    /**
     * 根据id删除单条数据
     * @param blogId 标签id
     * @return 删除条数
     */
    int deleteById(
            String blogId
    );

    /**
     * 批量删除根据复数新闻id
     * @param blogIdList 复数新闻id
     * @return 删除条数
     */
    int deleteByIdBatch(
            @Param("blogIdList")
            List<String> blogIdList
    );

    /**
     * 根据id查询
     * @param blogId 新闻id
     * @return 单个查询结果；可能为空
     */
    Blog selectById(
            String blogId
    );

    /**
     * 查询单个新闻全部信息，根据新闻id
     * @param blogId 新闻id
     * @return 单个新闻全部信息
     */
    Blog selectDetailById(
            String blogId
    );

    /**
     * 分页查询若干新闻，通过关键字；
     * 关键字出现在标题或者正文
     *
     * @param keyWord 关键字
     * @param page    当前页
     * @param limit   当前页数据条数
     * @return 结果列表
     */
    List<Blog> selectByKeyWordPage(
            @Param("keyWord")
            String keyWord,
            @Param("page")
            int page,
            @Param("limit")
            int limit
    );

    /**
     * 分页查询若干新闻，通过关键字；
     * 关键字出现在标题或者正文
     *
     * @param keyWord 关键字
     * @return 结果列表
     */
    List<Blog> selectByKeyWord(
            @Param("keyWord")
            String keyWord
    );

    /**
     * 分页查询已发布的新闻
     * @param page 指定当前页
     * @param limit 指定每页展示数量
     * @return 新闻列表
     */
    List<Blog> selectAllPublishedPage(
            @Param("page")
            int page,
            @Param("limit")
            int limit
    );

    /**
     * 分页查询已发布的新闻
     * @return 新闻列表
     */
    List<Blog> selectAllPublished();

    /**
     * 查询新闻，根据标题关键字和类型id和是否推荐状态
     * 如果标题关键字和类别id都为null，那么不进行title字段和type_id字段的条件限制
     * @param keyWord 标题关键字
     * @param typeId 类别id
     * @param isCommend 是否推荐状态
     * @return 新闻列表，可能为空
     */
    List<Blog> selectByKeyWordAndTypeIdAndCommend(
            @Param("keyWord")
            String keyWord,
            @Param("typeId")
            String typeId,
            @Param("isCommend")
            boolean isCommend
    );

    /**
     * 分页查询若干新闻根据类别id
     *
     * @param typeId 类别id
     * @param page   当前页
     * @param limit  当前页展示条数
     * @return 新闻列表
     */
    List<Blog> selectByTypeIdPage(
            @Param("typeId")
            String typeId,
            @Param("page")
            int page,
            @Param("limit")
            int limit
    );

    /**
     * 分页查询若干新闻根据类别id
     *
     * @param typeId 类别id
     * @return 新闻列表
     */
    List<Blog> selectByTypeId(
            @Param("typeId")
            String typeId
    );

    /**
     * 查询若干新闻，根据标签id下指定范围的新闻id
     * @param tagId 标签id
     * @param page 当前页
     * @param limit 当前页展示条数
     * @return 新闻列表
     */
    List<Blog> selectByTagIdPage(
            @Param("tagId")
            String tagId,
            @Param("page")
            int page,
            @Param("limit")
            int limit
    );

    /**
     * 查询若干新闻，根据标签id下指定范围的新闻id
     * @param tagId 标签id
     * @return 新闻列表
     */
    List<Blog> selectByTagId(
            @Param("tagId")
            String tagId
    );

    /**
     * 查询所有推荐的新闻
     * @return 推荐的新闻列表
     */
    List<Blog> selectByCommend();

    /**
     * 查询访问量最多的1个新闻
     * 使用排序和分页实现
     * @return 访问量最多的1个新闻
     */
    Blog selectTopOneViews();

    /**
     * 查询点赞量优先的最多点赞数的前6名新闻
     * 访问量优先级低于点赞量
     * 使用排序和分页实现
     * @return 前6名新闻
     */
    List<Blog> selectTopSixLikes();

    /**
     * 查询被推荐的访问量前4名的新闻
     * 使用排序和分页实现
     * @return 前4名新闻
     */
    List<Blog> selectTopFourViewsWithCommend();

    /**
     * 查询当前类别下除了该新闻id代表的，以外的所有新闻
     * @param typeId 类别id
     * @param blogId 该新闻id
     * @return 除了该新闻id代表的，以外的所有新闻
     */
    List<Blog> selectByTypeIdAndBlogIdWithoutEliminateBlog(
            @Param("typeId")
            String typeId,
            @Param("blogId")
            String blogId
    );

    /**
     * 查询若干新闻，根据标签id列表下，指定范围的新闻id
     * 指定范围固定为第一页的前6条
     * 并且排除当前新闻本身
     * @param tagIdList 标签id列表
     * @param blogId 排除当前新闻本身
     * @return 新闻列表
     */
    List<Blog> selectByTagIdList(
            @Param("tagIdList")
            List<String> tagIdList,
            @Param("blogId")
            String blogId
    );

    /**
     * 查询该新闻的在数据库中的前一个新闻
     * 通过比较id实现和分页
     * @param blogId 该新闻id
     * @return 前一个新闻
     */
    Blog selectBeforeById(
            @Param("blogId")
            String blogId
    );

    /**
     * 查询该新闻的在数据库中的后一个新闻
     * 通过比较id实现和分页
     * @param blogId 该新闻id
     * @return 后一个新闻
     */
    Blog selectAfterById(
            @Param("blogId")
            String blogId
    );

    /**
     * 随机获取若干数量新闻
     * SQL语句时查询全部新闻
     * 通过Collections.shuffle()方法达到随机目的。
     * @return 全部新闻列表；查询的字段是id, title, author, flag, views, `like`
     */
    List<Blog> selectRandom();

    /**
     * 查询新闻正文内容根据新闻id
     * @param blogId 新闻id
     * @return 新闻正文内容
     */
    String selectContentById(
            @Param("blogId")
            String blogId
    );

    /**
     * 查询创建日期和标题
     * 按照从新到旧的顺序排序
     * @return 创建日期和标题
     */
    List<Blog> selectAllOfTimeAndTitle();

    /**
     * 查询新闻的新闻id和新闻标题，根据新闻id
     * @param blogId 新闻id
     * @return 新闻id和新闻标题
     */
    Blog selectIdAndTitleById(
            @Param("blogId")
            String blogId
    );

    /**
     * 根据新闻id查询新闻描述
     * @param blogId 新闻id
     * @return 新闻描述
     */
    String selectDescriptionById(
            @Param("blogId")
            String blogId
    );

    /**
     * 查询所有新闻的档案数据
     * 档案数据主要是创建日期和标题概要
     * @return 档案数据列表
     */
    List<Archives> selectArchives();

    /**
     * 查询新闻id根据新闻id；用来判断指定新闻id数据是否为空
     * @param blogId 新闻id
     * @return 新闻id
     */
    Blog selectBlogNotNull(
            @Param("blogId")
            String blogId
    );

    /**
     * 查询若干新闻数量，通过关键字；
     * 关键字出现在标题或者正文
     * @param keyWord 关键字
     * @return 满足关键字的新闻数量
     */
    Integer selectCountByKeyWord(
            String keyWord
    );

    /**
     * 查询当前类别下有多少新闻
     * @param typeId 类别id
     * @return 新闻数量
     */
    Integer selectCountByTypeId(
            @Param("typeId")
            String typeId
    );

    /**
     * 查询指定标签下的新闻数量
     * @param tagId 标签id
     * @return 新闻数量
     */
    Integer selectCountByTagId(
            @Param("tagId")
            String tagId
    );

    /**
     * 查询所有新闻数量，包含保存的新闻和发布的新闻
     * @return 所有新闻数量
     */
    Integer selectCount();

    /**
     * 查询所有保存的新闻数量
     * @return 所有保存的新闻数量
     */
    Integer selectSaveCount();

    /**
     * 查询所有已发布的新闻的数量
     *
     * @return 所有已发布的新闻的数量
     */
    Integer selectPublishCount();
}
